package com.kun.reflection.demo02_memoryAnalysis;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

//通过反射获取类的信息
public class Test04 {

    @Test
    public void test01() throws Exception {
        Class studentClass = Class.forName("com.kun.reflection.demo02_memoryAnalysis.Student");
        //1. 获取类的信息
        System.out.println("类的名称：" + studentClass.getName());   //包名+类名
        System.out.println("类的包名：" + studentClass.getSimpleName()); //类名
        //2. 获取类的字段
        for (Field field : studentClass.getDeclaredFields()) {    //getDeclaredFields()获取所有字段，包括私有字段
            System.out.println("字段名称：" + field.getName());
            System.out.println("字段类型：" + field.getType().getName());
        }
        for (Field field : studentClass.getFields()) {        //getFields()获取所有公共字段
            System.out.println("字段名称：" + field.getName());
            System.out.println("字段类型：" + field.getType().getName());
        }
        //3. 获取类的方法
        for (Method method : studentClass.getDeclaredMethods()) {    //getDeclaredMethods()获取所有方法，自身类
            System.out.println("方法名称：" + method.getName()+"，参数个数："+method.getParameterTypes().length);
        }
        System.out.println("----------");
        for (Method method : studentClass.getMethods()) {    //getMethods()获取所有方法，自身类和父类
            System.out.println("方法名称：" + method.getName()+"，参数个数："+method.getParameterTypes().length);
        }
        System.out.println("----------");
        //4. 获取类的构造方法
        for (Constructor constructor : studentClass.getConstructors()) { //getConstructors()获取所有公共构造方法
            System.out.println("构造方法为：" + constructor.getName() + "，参数个数：" + constructor.getParameterTypes().length);
        }
        for (Constructor constructor : studentClass.getDeclaredConstructors()) {    //getDeclaredConstructors()获取所有构造方法，包括私有构造方法
            System.out.println("构造方法为：" + constructor.getName() + "，参数个数：" + constructor.getParameterTypes().length);
        }
        System.out.println("----------");
        //5. 获取父类信息
        Class superclass = studentClass.getSuperclass();//获取父类
        System.out.println("父类名称：" + superclass.getName());
        System.out.println("----------");
        //6. 获取接口信息
        Class[] interfaces = studentClass.getInterfaces();
        for (Class anInterface : interfaces) {
            System.out.println("接口名称：" + anInterface.getName());
        }
        System.out.println("----------");
        //7. 获取注解信息
        //...




    }
}


@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
    private String name;
    private int age;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Student extends Person implements Runnable {
    private String school;

    @Override
    public void run() {
        System.out.println("学生在跑");
    }
}
